package pl.fiszkiapp.play;

import java.util.Random;

/**
 * Klasa losujaca kolejne pytania do testu.
 * @author Piotr Czerwiec
 */
public class QuestionDrawer {	
	
	//tablica ktora zapamietuje, ile razy odwiedzono pytanie.
	private byte [] visited;	
	
	//Ile razy chcemy powtorzyc test
	private byte roundsNumber;
	
	//Ile pytan w tescie pozostalo jeszcze 
	private int questionsCounter;
	
	//Na ile pytan nalezy odpowiedziec
	private int questionsNumber;
	
	//Obiekt generujacy liczby losowe
	private Random rand;
	
	//Ile tablica przechowujaca info czy na dane pytanie odpowiedziano
	//poprawnie true - poprawna odpowiedz, false - bledna odpowiedz
	private boolean [] correct;
	
	/**
	 * @param questionsNumber Z ilu pytan sklada sie caly test.
	 */
	public QuestionDrawer(int questionsNumber) {
		this.visited = new byte[questionsNumber];
		this.correct = new boolean[questionsNumber];
		this.questionsCounter = questionsNumber;
		this.questionsNumber = questionsNumber;
		this.rand = new Random();
		this.rand.setSeed(System.currentTimeMillis());
		this.roundsNumber = 1;
		for (int i = 0; i < visited.length; i++) {
			this.visited[i] = roundsNumber;
		}
	}	
	
	/**
	 * Funkcja losujaca kolejne pytanie do testu.
	 * @return
	 */
	public int draqQuestion() {
		questionsCounter--;
		int result;
		
		//Losuje pytania, dopoki nie znajdzie jeszcze nie 
		//wylosowanego w tej rundzie.
		//TODO: zrobic liste pytan ktorych nie bylo i losowac wsrod nich, czas bedzie staly
		while(true) {
			result = rand.nextInt(visited.length);
			if (visited[result] == roundsNumber) {
				visited[result]--;
				break;
			}			
		}
		//Po odpowiedzeniu na wszystkie pytania zmniejsza sie ilosc rund.		
		if (questionsCounter == 0) {
			roundsNumber--;	
			questionsCounter = questionsNumber;
		}
		
		return result;
	}
	/**
	 * Zaznaczenie ze na dane pytanie odpowiedziano poprawnie.
	 * @param index Numer pytania w bazie.
	 */
	public void correctAnswer(int index) {
		this.correct[index] = true;
	}
	
	/**
	 * Zaznaczenie ze na dane pytanie odpowiedziano blednie.
	 * @param index Numer pytania w bazie.
	 */
	public void wrongAnswer(int index) {
		correct[index] = false;
	}
	
	/**
	 * Ustalenie, ile razy chce sie powtorzyc pytania, na ktore
	 * udzielilo sie zlej odpowiedzi.
	 * @param ileRazy Ilosc powtorzen testu.
	 */
	public void repeatWrongAnswers(byte roundsNumber) {
		this.roundsNumber = roundsNumber;
		
		for (int i = 0; i < correct.length; i++) {
			if (correct[i]) {
				this.visited[i] = 0;
			} else {
				this.visited[i] = roundsNumber;
			}
		}
	}
	/**
	 * Zwraca procent poprawnych odpowiedzi.
	 * @return
	 */
	public byte correctnessRatio() {
	    double correctNumber = 0;
	    double result = 0;
	    questionsNumber = 0;
	    
		for (int i = 0; i < correct.length; i++) {
			if (correct[i]) {
				correctNumber++;
			} else {
				questionsNumber++;
			}
		}
		questionsCounter = questionsNumber;
		result = correctNumber / (double) correct.length * 100.0;
		
		return (byte) result;
	}
	
	public int roundsNumber() {
		return roundsNumber;
	}
}
